/**
  * @addtogroup 
  * 
  *
  * @brief 
  *
  * @code{c}
  * @endcode
  * @{
  * @file         bsc_electric_fence_zone_algo.h
  * @brief        定义区域数据结构体
  * @note
  * @author       Jpz(puzhao.jin@hopechart，靳普诏)
  * @date         2022-09-22
  * @version      1.0
  * 
  * @par          修改日志
  * <table>
  * <tr><th>Date        <th>Version          <th>Author                        <th>Description
  * <tr><td>2022-09-22  <td>1.0              <td>Jpz                           <td>创建初始版本
  * @copyright    杭州鸿泉物联网技术股份有限公司
  */



#ifndef _BSC_ELECTRIC_FENCE_ZONE_ALGO_H_
#define _BSC_ELECTRIC_FENCE_ZONE_ALGO_H_

// ~~~~~~~~~~~~ 统一包含头文件 ~~~~~~~~~~~~

#include "bsc_electric_fence/bsc_electric_fence_define.h"
#include "bsc_electric_fence/bsc_electric_fence_zone_data.h"

#ifdef __cplusplus
extern "C" {
#endif


/**
 * 查看当前坐标point是否在圆形区域内
 * @param circle: 圆形区域
 * @param point: 当前坐标
 * @return True 在区域内  False 不在区域内
 */
Bool BsElectricFenceAlgoIsInCircle(TBsElectricFenceCircle *circle, const TBsElectricFencePoint *point);


/**
 * 查看当前坐标point是否在矩形区域内(线段也是调用矩形接口去判断)
 * @param rect: 矩形区域
 * @param point: 当前坐标
 * @return True 在区域内  False 不在区域内
 */
Bool BsElectricFenceAlgoIsInRect(TBsElectricFenceRect *rect, const TBsElectricFencePoint *point);

/**
 * 查看当前坐标point是否在多边形区域内
 * @param poly: 多边形区域
 * @param point: 当前坐标
 * @return True 在区域内  False 不在区域内
 */
Bool BsElectricFenceAlgoIsInPoly(TBsElectricFencePoly *poly, const TBsElectricFencePoint *point);

/**
 * 查看当前坐标point是否在路线内
 * @param inflexion: 拐点信息
 * @param count: 拐点个数
 * @param point: 当前坐标
 * @return Int8  -1--不在区域内   i--在第i个路线拐点
 */
Int8 BsElectricFenceAlgoIsInLine(TBsElectricFenceLine *Line, const TBsElectricFencePoint *point);

/**
*   计算两点之间的记录
* @param  两点坐标的经纬度
* @return 两点之间的距离
*/
UInt32 BsElectricFenceDoublePointDistance(const TBsElectricFencePoint *point1, const TBsElectricFencePoint *point2);


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/**
 * 添加判断上一时刻和缓冲距离判断当前坐标point是否在圆形区域内
 * @param *circle       圆形区域
 * @param *point        当前坐标
 * @param last_status   最后一次有效状态，True 在区域内，False 不在区域内
 * @param buff_dist     缓冲距离
 * @return True 在区域内  False 不在区域内
 */
Bool BsElectricFenceAlgoIsInCircleByJudge(TBsElectricFenceCircle *circle, const TBsElectricFencePoint *point, Bool last_status, UInt32 buff_dist);

/**
 * 添加判断上一时刻和缓冲距离判断当前坐标point是否在矩形区域内(线段也是调用矩形接口去判断)
 * @param rect: 矩形区域
 * @param point: 当前坐标
 * @param last_status   最后一次有效状态，True 在区域内，False 不在区域内
 * @param buff_dist     缓冲距离
 * @return True 在区域内  False 不在区域内
 */
Bool BsElectricFenceAlgoIsInRectByJudge(TBsElectricFenceRect *rect, const TBsElectricFencePoint *point, Bool last_status, UInt32 buff_dist);

/**
 * 添加判断上一时刻和缓冲距离判断当前坐标point是否在多边形区域内
 * @param poly: 多边形区域
 * @param point: 当前坐标
 * @param last_status   最后一次有效状态，True 在区域内，False 不在区域内
 * @param buff_dist     缓冲距离
 * @return True 在区域内  False 不在区域内
 */
Bool BsElectricFenceAlgoIsInPolyByJudge(TBsElectricFencePoly *poly, const TBsElectricFencePoint *point, Bool last_status, UInt32 buff_dist);

/**
 * 添加判断上一时刻和缓冲距离判断当前坐标point是否在路线内
 * @param inflexion: 拐点信息
 * @param count: 拐点个数
 * @param point: 当前坐标
 * @param last_status   最后一次有效状态，True 在区域内，False 不在区域内
 * @param buff_dist     缓冲距离
 * @return Int8  -1--不在区域内   i--在第i个路线拐点
 */
Bool BsElectricFenceAlgoIsInLineByJudge(TBsElectricFenceLine *line, const TBsElectricFencePoint *point, Bool last_status, UInt32 buff_dist);




#ifdef __cplusplus
}  ///< extern "C" {
#endif


#endif

